﻿/*=================================================================
  * Author:          DZH
  * CreatedTime:     2018-05-17
  * Description:     微信Jssdk功能封装
  * version:         v2.0
  *
  * Modified By :    DZH
  * ModifiedTime:    2018-12-19
  * ModifiedNote:
 ===================================================================*/

; (function (window) {

    if (window.wxcommon) {
        return;
    }
    //wxsdk权限数组
    var jsApiList = [
        //分享朋友圈--即将过期
        "onMenuShareTimeline",
        //分享好友--即将过期
        "onMenuShareAppMessage",
         //分享到QQ--即将过期
        "onMenuShareQQ",
        //分享到微博
        "onMenuShareWeibo",
        //分享到qq空间
        "onMenuShareQZone",
        //调起支付【new】--wxjssdk 1.4.0以上版本支持
        "chooseWXPay",
        //分享到朋友圈（1.4.0）
        "updateAppMessageShareData",
        //分享给朋友（1.4.0）
        "updateTimelineShareData",

        "startRecord", "stopRecord", "onVoiceRecordEnd", "playVoice",

"pauseVoice", "stopVoice", "onVoicePlayEnd", "uploadVoice", "downloadVoice",

"chooseImage", "previewImage", "uploadImage", "downloadImage", "translateVoice",

"getNetworkType", "openLocation", "getLocation",

"hideOptionMenu", "showOptionMenu", "hideMenuItems",

"showMenuItems", "hideAllNonBaseMenuItem", "showAllNonBaseMenuItem",

"closeWindow", "scanQRCode", "chooseWXPay", "openProductSpecificView", "addCard",

"chooseCard", "openCard",

    ];
    //默认微信票据地址
    var ticketUrl = location.protocol + "//" + location.hostname + "/share/wx/getticketpack";
    //默认注放配置项
    var defaultOption = {
        debug: false,
        ticketUrl: "",
        jsApiList: jsApiList,
         shareObj: null,
        //wxReady: function () {
        //}
    }

    //WxJssdk权限验证注入配置
    function _config(option) {
        defaultOption = $.extend(defaultOption, option);
        if (!defaultOption.ticketUrl) {
            defaultOption.ticketUrl = ticketUrl;
        }
        $.post(defaultOption.ticketUrl,'', function (result) {
            if (option.debug) {
                alert(JSON.stringify(defaultOption));
                console.log(result);
            }
            wx.config({
                debug: defaultOption.debug, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
                appId: result.appId, // 必填，公众号的唯一标识
                timestamp: result.timestamp, // 必填，生成签名的时间戳
                nonceStr: result.nonceStr, // 必填，生成签名的随机串
                signature: result.signature,// 必填，签名
                jsApiList: defaultOption.jsApiList // 必填，需要使用的JS接口列表
            });

            /*
            --config信息验证后会执行ready方法，所有接口调用都必须在config接口获得结果之后，
            --config是一个客户端的异步操作，所以如果需要在页面加载时就调用相关接口，则须把相关接口放在ready函数中调用来确保正确执行。
            --对于用户触发时才调用的接口，则可以直接调用，不需要放在ready函数中
            */
            wx.ready(function () {
                if (defaultOption.shareObj) {
                    _share(defaultOption.shareObj);
                }
                if (defaultOption.wxReady && $.isFunction(defaultOption.wxReady)) {
                    defaultOption.wxReady();
                }
            });

            wx.error(function (res) {
                alert(JSON.stringify(res));
            });
        }, "json");

    }

    //调起下单支付--老接口，不要求票据注入
    function _callPay(option) {

        $.ajax({
            url: option.url,
            type: "Post",
            data: option.data,
            dataType: "json",
            success: function (result) {
                if (option.debug) {
                    console.log(result);
                    alert(JSON.stringify(result));
                }
                if (result.ErrorCode == 0) {
                    if (result.Data.mweb_url)
                    {
                        window.location.href = result.Data.mweb_url;
                        return;
                    }
                    var jsondata = "";
                    if (result.Data.model) {
                        jsondata = result.Data.model;
                    }
                    else if (result.data.call_pay_json) {
                        jsondata = result.Data.call_pay_json;
                    }
                    var orderData = JSON.parse(jsondata);
                    WeixinJSBridge.invoke(
                          'getBrandWCPayRequest',
                           orderData,//调起支付参数
                           function (res) {
                               if (res.err_msg == "get_brand_wcpay_request:ok") {
                                   if (option.callback === undefined) {
                                       alert("支付成功！");
                                   }
                                   else {
                                       option.callback();
                                   }
                               }
                               else {
                                   alert(res.err_msg);
                               }
                           });
                }
            },
            error: function (result) {
                alert(JSON.stringify(result));
            }
        });
    };

    //发起支付请求--新接口,要求票据注入
    function _callPayNew(option) {
        $.ajax({
            url: option.url,
            type: "Post",
            data: option.data,
            dataType: "json",
            success: function (result) {
                if (option.debug) {
                    console.log(result);
                    alert(JSON.stringify(result));
                }
                if (result.ErrorCode == 0) {

                    if (result.Data.mweb_url) {
                        window.location.href = result.Data.mweb_url;
                        return;
                    }

                    var jsondata = "";
                    if (result.Data.model) {
                        jsondata = result.Data.model;
                    }
                    else if (result.Data.call_pay_json) {
                        jsondata = result.Data.call_pay_json;
                    }
                    var orderData = JSON.parse(jsondata);
                    wx.chooseWXPay({
                        timestamp: orderData.timeStamp, // 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
                        nonceStr: orderData.nonceStr, // 支付签名随机串，不长于 32 位
                        package: orderData.package, // 统一支付接口返回的prepay_id参数值，提交格式如：prepay_id=\*\*\*）
                        signType: "MD5", // 签名方式，默认为'SHA1'，使用新版支付需传入'MD5'
                        paySign: orderData.paySign, // 支付签名
                        success: function (res) {
                            // 支付成功后的回调函数
                            if (res.errMsg == "chooseWXPay:ok") {
                                if (option.callback === undefined) {
                                    alert("支付成功！");
                                }
                                else {
                                    option.callback();
                                }
                            }
                            else {
                                alert(res.errMsg);
                            }
                        }
                    });
                }
            },
            error: function (result) {
                alert(JSON.stringify(result));
            }
        });
    }

    //调起待支付订单
    function _callPayOrder(option) {
        var orderData = {};
        if (!$.isPlainObject(option.OrderData)) {
            orderData = JSON.parse(option.OrderData);
        }
        else {
            orderData = option.OrderData;
        }
        WeixinJSBridge.invoke(
              'getBrandWCPayRequest',
               orderData,//调起支付参数
               function (res) {
                   if (res.err_msg == "get_brand_wcpay_request:ok") {
                       if (option.callback === undefined) {
                           alert("支付成功！");
                       }
                       else {
                           option.callback();
                       }
                   }
                   else {
                       alert(res.err_msg);
                   }
               });
    }

    //快捷分享注入
    function _share(shareObj) {
        wx.updateAppMessageShareData({
            title: shareObj.title, // 分享标题
            desc: shareObj.desc, // 分享描述
            link: shareObj.link, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: shareObj.imgUrl, // 分享图标
            success: function () {
                // 设置成功
                if (shareObj.success) {
                    shareObj.success();
                }
            },
            cancel: function () {
                if (shareObj.cancel) {
                    shareObj.cancel();
                }
            }
        })
        wx.updateTimelineShareData({
            title: shareObj.title, // 分享标题
            link: shareObj.link, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: shareObj.imgUrl, // 分享图标
            success: function () {
                // 设置成功
                if (shareObj.success) {
                    shareObj.success();
                }
            },
            cancel: function () {
                if (shareObj.cancel) {
                    shareObj.cancel();
                }
            }
        })


        //wx.onMenuShareTimeline({
        //    title: shareObj.title, // 分享标题
        //    link: shareObj.link, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
        //    imgUrl: shareObj.imgUrl, // 分享图标
        //    success: function () {
        //        // 用户点击了分享后执行的回调函数
        //        if (shareObj.success) {
        //            shareObj.success();
        //        }
        //    },
        //    cancel: function () {
        //        if (shareObj.cancel) {
        //            shareObj.cancel();
        //        }
        //    }
        //});
        //wx.onMenuShareAppMessage({
        //    title: shareObj.title, // 分享标题
        //    desc: shareObj.desc, // 分享描述
        //    link: shareObj.link, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
        //    imgUrl: shareObj.imgUrl, // 分享图标
        //    success: function () {
        //        // 用户点击了分享后执行的回调函数
        //        if (shareObj.success) {
        //            shareObj.success();
        //        }
        //    },
        //    cancel: function () {
        //        if (shareObj.cancel) {
        //            shareObj.cancel();
        //        }
        //    }
        //});
        //wx.onMenuShareQQ({
        //    title: shareObj.title, // 分享标题
        //    desc: shareObj.desc, // 分享描述
        //    link: shareObj.link, // 分享链接
        //    imgUrl: shareObj.imgUrl, // 分享图标
        //    success: function () {
        //        if (shareObj.success) {
        //            shareObj.success();
        //        }
        //    },
        //    cancel: function () {
        //        if (shareObj.cancel) {
        //            shareObj.cancel();
        //        }
        //    }
        //});
        //wx.onMenuShareWeibo({
        //    title: shareObj.title, // 分享标题
        //    desc: shareObj.desc, // 分享描述
        //    link: shareObj.link, // 分享链接
        //    imgUrl: shareObj.imgUrl, // 分享图标
        //    success: function () {
        //        if (shareObj.success) {
        //            shareObj.success();
        //        }
        //    },
        //    cancel: function () {
        //        if (shareObj.cancel) {
        //            shareObj.cancel();
        //        }
        //    }
        //});
        //wx.onMenuShareQZone({
        //    title: shareObj.title,
        //    desc: shareObj.desc,
        //    link: shareObj.link,
        //    imgUrl: shareObj.imgUrl,
        //    success: function () {
        //        if (shareObj.success) {
        //            shareObj.success();
        //        }
        //    },
        //    cancel: function () {
        //        if (shareObj.cancel) {
        //            shareObj.cancel();
        //        }
        //    }
        //});
    }
    window.wxcommon = {
        ticketUrl: ticketUrl,
        jsApiList: jsApiList,
        config: _config,
        callPay: _callPay,
        callNewPay: _callPayNew,
        callPayOrder: _callPayOrder,
        share: _share
    };

})(window);
